package slidingwindow;

import java.util.HashMap;
import java.util.Map;

public class solution3 {
    public static int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0){
            return 0;
        }

        //依旧滑动窗口题目
        //这个窗口用来记录[left,right)当中有啥字符
        Map<Character,Integer> window = new HashMap<>();

        int left=0;
        int right=0;
        //记录window中是否有重复元素
        int repeat=0;

        int resultLength=Integer.MIN_VALUE;
        //依旧套模板
        while(right<s.length()){
            //写在这里有bug啊尼玛
            //其实也没有bug，只是right处在length的时候，下面的代码不会再更新数据
            //有可能right处在length的时候，right-length的长度才是最大的
            if(right-left>resultLength){
                resultLength=right-left;
            }
            //什么情况right需要往右边跑？
            //window中没有重复的元素，right就要往右边跑
            char c = s.charAt(right);
            right++;

            //更新数据
            //将当前字符加入到window窗口
            window.put(c,window.getOrDefault(c,0)+1);
            //c字符对应的个数大于1了，说明窗口中存在重复元素
            if(window.get(c)>1){
                repeat++;
            }

            //依旧套模板
            //while(window need shrink)
            //window什么时候缩小？当然是window中有重复元素的时候
            while(repeat>0){
                //我们得思考一下判定结果是应该写在这里吗。。。。。

                //依旧套模板
                char cRemove = s.charAt(left);
                left++;

                //依旧更新数据
                if(window.get(cRemove)>1){
                    repeat--;
                }
                window.put(cRemove,window.get(cRemove)-1);
            }

        }

        //因此我们需要加这一句，补上最后一次更新
        resultLength = (resultLength>(right-left)?resultLength:right-left);

        return resultLength;


    }

    public static void main(String[] args) {
        String s = "au";
        System.out.println(s.length());
        int longestSubstring = lengthOfLongestSubstring(s);
        System.out.println("longestSubstring = " + longestSubstring);
    }
}
